import path from 'path';
import fs from 'fs-extra';
import { defineConfig } from '@rsbuild/core';
import { pluginUmd } from '@rsbuild/plugin-umd';
import { pluginVue2 } from '@rsbuild/plugin-vue2';

// 项目package.json路径
const PACKAGE_JSON_PATH = path.resolve(process.cwd(), 'package.json');
// 读取内容
let packageJson = fs.readJsonSync(PACKAGE_JSON_PATH);
// 组件名称
let componentName = 'dev/component@0.0.1[name]';
// 生产模式
if (process.env.NODE_ENV === 'production') {
  componentName = `${packageJson.namespace}/${packageJson.name}@${packageJson.version}[name]`
}

const COMPONENT_PATH = '__NAMESPACE__/__NAME__@__VERSION__';

export default defineConfig({
  plugins: [pluginVue2(), pluginUmd({
    name: componentName,
  })],
  source: {
    // 配置入口
    entry: {
      index: {
        import: '../src/Index.vue',
      },
      editor: {
        import: '../src/Editor.vue',
      },
    },
    // 别名配置
    alias: {
      '@build': path.resolve(__dirname),
    },
    // 按需引入
    transformImport: [
      {
        libraryName: 'vant',
        libraryDirectory: 'es',
        style: true,
      },
    ],
  },
  output: {
    assetPrefix: `__OSS_BUCKET__${COMPONENT_PATH.replace('@', '/')}/`, // __OSS_BUCKET__占位符请勿修改，文件上传时会自动替换
    // charset: 'utf8',
    // 将CSS样式插入到DOM中
    injectStyles: true,
    // 因不对外发布，移除LEGAL减少体积
    legalComments: 'none',
    distPath: {
      root: 'dist',
      js: './',
      image: './',
    },
  },
  dev: {
    assetPrefix: true, // 加前缀，解决热更新文件相对地址请求到线上域名的问题
    setupMiddlewares: [(middlewares, server) => {
      middlewares.unshift((req, res, next) => {
        if (req.method == 'OPTIONS') { // 通过中间件处理options请求404问题
          res.statusCode = 200;
          res.end();
        } else {
          next();
        }
      });
    }],
    client: {
      // 添加开发客户端域名，避免socket请求到线上地址
      host: '127.0.0.1',
    },
    // 开发产物写入硬盘，便于调试
    // writeToDisk: true,
  },
  tools: {
    // 禁止生成HTML
    htmlPlugin: false,
    rspack: (config, { env }) => {
      // 排除打包
      config.externals = {
        'gods-x': '$GP',
        'vue': 'Vue',
      };
      // 添加node_modules路径避免查找失败
      config.resolve.modules = [path.resolve(__dirname, 'node_modules'), 'node_modules'];
      if (env === 'development') {
        // 解决同时引入多个入口热更新报错问题，感谢rspack团队@陈嘉涵提供解决方案，文档：https://webpack.docschina.org/configuration/optimization/#optimizationruntimechunk
        config.optimization.runtimeChunk = 'single';
      }
      if (env === 'production') {
        // 生产模式禁用分包优化，避免打包后出错
        config.optimization.splitChunks = false;
      }
      return config;
    }
  },
  // 开发服务配置
  server: {
    // 仅使用本地地址
    host: '127.0.0.1',
    // 启用HTTPS
    https: {
      cert: fs.readFileSync('cert/cert.pem', 'utf-8'),
      key: fs.readFileSync('cert/cert-key.pem', 'utf-8'),
    },
  },
  performance: {
    // 生产环境移除所有console
    removeConsole: true,
  },
});
